package com.twitter.home_mixer.product.scored_tweets.candidate_pipeline

import com.twitter.home_mixer.product.scored_tweets.gate.MinCachedTweetsGate
import com.twitter.home_mixer.product.scored_tweets.model.ScoredTweetsQuery
import com.twitter.home_mixer.product.scored_tweets.param.ScoredTweetsParam.CachedScoredTweets
import com.twitter.home_mixer.product.scored_tweets.param.ScoredTweetsParam.CandidatePipeline
import com.twitter.home_mixer.product.scored_tweets.query_transformer.TimelineRankerUtegQueryTransformer
import com.twitter.home_mixer.product.scored_tweets.response_transformer.ScoredTweetsUtegResponseFeatureTransformer
import com.twitter.product_mixer.component_library.candidate_source.timeline_ranker.TimelineRankerUtegCandidateSource
import com.twitter.product_mixer.component_library.model.candidate.TweetCandidate
import com.twitter.product_mixer.core.functional_component.candidate_source.BaseCandidateSource
import com.twitter.product_mixer.core.functional_component.gate.Gate
import com.twitter.product_mixer.core.functional_component.transformer.CandidateFeatureTransformer
import com.twitter.product_mixer.core.functional_component.transformer.CandidatePipelineQueryTransformer
import com.twitter.product_mixer.core.functional_component.transformer.CandidatePipelineResultsTransformer
import com.twitter.product_mixer.core.model.common.identifier.CandidatePipelineIdentifier
import com.twitter.product_mixer.core.pipeline.candidate.CandidatePipelineConfig
import com.twitter.timelineranker.{thriftscala => t}
import com.twitter.timelines.configapi.decider.DeciderParam
import javax.inject.Inject
import javax.inject.Singleton

/**
 * Candidate Pipeline Config that fetches tweets from the Timeline Ranker UTEG Candidate Source
 */
//当然可以。这段代码定义了一个名为 ScoredTweetsUtegCandidatePipelineConfig 的类，
// 它配置了一个特定的候选管道，用于从 Twitter 的时间线排名器 UTEG（Under-The-Engagement-Gun）源获取推文。
// 让我们详细分析这个类中的关键函数和它们的逻辑。
@Singleton
class ScoredTweetsUtegCandidatePipelineConfig @Inject() (
  //这个构造函数将 TimelineRankerUtegCandidateSource 作为参数，意味着这个管道专门用于处理来自 UTEG 的推文。
  timelineRankerUtegCandidateSource: TimelineRankerUtegCandidateSource)
    extends CandidatePipelineConfig[
      ScoredTweetsQuery,
      t.UtegLikedByTweetsQuery,
      t.CandidateTweet,
      TweetCandidate
    ] {
  //为这个候选管道配置提供了一个唯一的标识符，用于在系统中标识和引用。
  override val identifier: CandidatePipelineIdentifier =
    CandidatePipelineIdentifier("ScoredTweetsUteg")
  //这个变量提供了一个决策参数，用于确定是否启用这个管道。
  override val enabledDeciderParam: Option[DeciderParam[Boolean]] =
    Some(CandidatePipeline.EnableUtegParam)

  override val gates: Seq[Gate[ScoredTweetsQuery]] = Seq(
    MinCachedTweetsGate(identifier, CachedScoredTweets.MinCachedTweetsParam)
  )
  //指定了候选源，即从哪里获取候选推文。这里使用 timelineRankerUtegCandidateSource 作为来源。
  override val candidateSource: BaseCandidateSource[t.UtegLikedByTweetsQuery, t.CandidateTweet] =
    timelineRankerUtegCandidateSource

  override val queryTransformer: CandidatePipelineQueryTransformer[
    ScoredTweetsQuery,
    t.UtegLikedByTweetsQuery
  ] = TimelineRankerUtegQueryTransformer(identifier)

  override val featuresFromCandidateSourceTransformers: Seq[
    CandidateFeatureTransformer[t.CandidateTweet]
  ] = Seq(ScoredTweetsUtegResponseFeatureTransformer)

  override val resultTransformer: CandidatePipelineResultsTransformer[
    t.CandidateTweet,
    TweetCandidate
  ] = { sourceResult => TweetCandidate(id = sourceResult.tweet.get.id) }
}
